#!/bin/bash

# Hadoop 配置
HADOOP_HOME="/usr/local/hadoop-3.3.5"
NAMENODE_DIR="$HADOOP_HOME/tmp/dfs/name"  # 直接使用您的配置路径
DATANODE_DIR="$HADOOP_HOME/tmp/dfs/data"  # DataNode 数据目录
LOG_FILE="/tmp/hadoop_startup_$(date +%Y%m%d_%H%M%S).log"

# 函数：记录日志并打印到屏幕
log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}

# 函数：检查命令执行状态
check_status() {
    if [ $? -ne 0 ]; then
        log "❌ 错误: $1 执行失败! 查看日志: $LOG_FILE"
        exit 1
    else
        log "✅ $1 执行成功"
    fi
}

# 检查目录是否存在，若不存在则创建
ensure_dir() {
    if [ ! -d "$1" ]; then
        log "目录 $1 不存在，自动创建..."
        mkdir -p "$1" || { log "❌ 无法创建目录 $1"; exit 1; }
        chmod 755 "$1"
    fi
}

# 检查 NameNode 是否需要格式化
need_format() {
    if [ ! -d "$NAMENODE_DIR/current" ]; then
        log "检测到 NameNode 元数据目录不存在，需要格式化。"
        return 0
    elif ! grep -q "clusterID" "$NAMENODE_DIR/current/VERSION" 2>/dev/null; then
        log "检测到 VERSION 文件损坏，需要格式化。"
        return 0
    else
        log "NameNode 已初始化，跳过格式化。"
        return 1
    fi
}

### ---------- 主流程 ---------- ###
log "开始启动 Hadoop 集群..."
log "NameNode 元数据路径: $NAMENODE_DIR"
log "DataNode 数据路径: $DATANODE_DIR"

# 检查并创建目录
ensure_dir "$NAMENODE_DIR"
ensure_dir "$DATANODE_DIR"

# 切换到 Hadoop 目录
cd "$HADOOP_HOME" || { log "❌ 无法进入目录 $HADOOP_HOME"; exit 1; }

### 1. 判断并格式化 NameNode
# if need_format; then
#     log "正在格式化 NameNode..."
#     bin/hdfs namenode -format -force >> "$LOG_FILE" 2>&1
#     check_status "NameNode 格式化"
# fi
### 1. 手动确认NameNode格式化
if need_format; then
    read -p "检测到需要格式化NameNode，是否继续？(y/n) " confirm
    if [[ $confirm =~ ^[Yy]$ ]]; then
        log "正在格式化 NameNode..."
        bin/hdfs namenode -format -force >> "$LOG_FILE" 2>&1
        check_status "NameNode 格式化"
    else
        log "用户取消格式化，跳过此步骤。"
    fi
fi

### 2. 启动 HDFS
log "启动 HDFS 服务..."
sbin/start-dfs.sh >> "$LOG_FILE" 2>&1
check_status "HDFS 启动"

### 3. 启动 YARN
log "启动 YARN 服务..."
sbin/start-yarn.sh >> "$LOG_FILE" 2>&1
check_status "YARN 启动"

### 4. 检查进程状态
log "检查 Java 进程 (jps)..."
jps_output=$(jps)
echo "$jps_output" | tee -a "$LOG_FILE"

# 关键进程检查
declare -A required_processes=(
    ["NameNode"]="NameNode"
    ["DataNode"]="DataNode"
    ["ResourceManager"]="ResourceManager"
    ["NodeManager"]="NodeManager"
)

missing_process=0
for proc in "${!required_processes[@]}"; do
    if ! echo "$jps_output" | grep -q "$proc"; then
        log "❌ 警告: 进程 $proc 未启动!"
        missing_process=1
    else
        log "✅ 进程 $proc 已运行"
    fi
done

if [ $missing_process -eq 1 ]; then
    log "⚠️ 部分进程未启动，请检查日志: $LOG_FILE"
else
    log "所有关键进程运行正常。"
fi

log "Hadoop 启动完成。Web 界面:"
log "  - HDFS: http://<主机名>:9870"
log "  - YARN: http://<主机名>:8088"
log "详细日志: $LOG_FILE"